package com.ai.service.made.impl;

import cn.hutool.core.util.StrUtil;
import com.ai.common.CommonResponse;
import com.ai.entity.made.ModbusNodeInfo;
import com.ai.entity.made.ModbusServerInfo;
import com.ai.entity.made.page.ModbusNodeInfoPage;
import com.ai.entity.made.page.ModbusServerInfoPage;
import com.ai.mapper.made.ModbusNodeInfoMapper;
import com.ai.model.dto.ModbusNodeInfoDto;
import com.ai.service.made.IModbusNodeInfoService;
import com.ai.service.made.IModbusServerInfoService;
import com.ai.util.SecurityUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

import static com.ai.common.constant.ModbusConstants.MODBUS_REGISTER_DEFAULT_ADDRESS;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author jiaok
 * @since 2024-11-26
 */
@Service
public class ModbusNodeInfoServiceImpl extends ServiceImpl<ModbusNodeInfoMapper, ModbusNodeInfo> implements IModbusNodeInfoService {


    @Resource
    private IModbusServerInfoService iModbusServerInfoService;

    @Override
    public CommonResponse<String> add(ModbusNodeInfoDto modbusNodeInfoDto) {

        if (modbusNodeInfoDto.getOffset()<MODBUS_REGISTER_DEFAULT_ADDRESS) {
            throw new RuntimeException("寄存器地址应大于40000");
        }

        ModbusNodeInfo modbusNodeInfo = new ModbusNodeInfo();
        BeanUtils.copyProperties(modbusNodeInfoDto,modbusNodeInfo);
        modbusNodeInfo.setOffset(modbusNodeInfoDto.getOffset() - MODBUS_REGISTER_DEFAULT_ADDRESS);
        modbusNodeInfo.setCreateUser(SecurityUtils.getLoginUserName());
        modbusNodeInfo.setCreateTime(LocalDateTime.now());
        modbusNodeInfo.setUpdateUser(SecurityUtils.getLoginUserName());
        modbusNodeInfo.setUpdateTime(LocalDateTime.now());
        boolean save = this.save(modbusNodeInfo);

        iModbusServerInfoService.update(new UpdateWrapper<ModbusServerInfo>().eq("id",modbusNodeInfoDto.getModbusServerId()).setSql("node_num = node_num +1"));

        return save?CommonResponse.ok("新增节点成功"):CommonResponse.error("新增节点失败");
    }

    @Override
    public CommonResponse<String> delete(String id) {

        ModbusNodeInfo modbusNodeInfo = this.getById(id);
        boolean remove = this.removeById(id);
        iModbusServerInfoService.update(new UpdateWrapper<ModbusServerInfo>().eq("id",modbusNodeInfo.getModbusServerId()).setSql("node_num = node_num -1"));

        return remove?CommonResponse.ok("删除节点成功"):CommonResponse.error("删除节点失败");
    }

    @Override
    public CommonResponse<String> edit(ModbusNodeInfoDto modbusNodeInfoDto) {

        if (StrUtil.isEmpty(modbusNodeInfoDto.getModbusServerId())){
            throw new RuntimeException("modbus服务器id不能为空");
        }
        if ((null != modbusNodeInfoDto.getOffset()) && (modbusNodeInfoDto.getOffset()<MODBUS_REGISTER_DEFAULT_ADDRESS)){
            throw new RuntimeException("寄存器地址应大于40000");
        }

        ModbusNodeInfo modbusNodeInfo = getOne(new QueryWrapper<ModbusNodeInfo>().eq("modbus_server_id", modbusNodeInfoDto.getModbusServerId())
                .eq("id",modbusNodeInfoDto.getId()));
        boolean update = this.update(new UpdateWrapper<ModbusNodeInfo>().eq("modbus_server_id", modbusNodeInfoDto.getModbusServerId())
                .eq("id",modbusNodeInfoDto.getId())
                .set(StrUtil.isNotBlank(modbusNodeInfoDto.getNodeName()), "node_name", modbusNodeInfoDto.getNodeName())
                .set((null != modbusNodeInfoDto.getSlaveId()), "slave_id", modbusNodeInfoDto.getSlaveId())
                .set("offset", modbusNodeInfoDto.getOffset() - MODBUS_REGISTER_DEFAULT_ADDRESS)
                .set("update_time",LocalDateTime.now())
                .set("update_user",SecurityUtils.getLoginUserName()))
                ;

        return update?CommonResponse.ok("修改成功"):CommonResponse.error("修改失败");
    }

    @Override
    public IPage selectByPage(ModbusNodeInfoPage page) {

        QueryWrapper<ModbusNodeInfo> queryWrapper = page.getQuery(new QueryWrapper<ModbusNodeInfo>());

        if ((null != page.getOffset()) && (page.getOffset()>MODBUS_REGISTER_DEFAULT_ADDRESS)){
            queryWrapper.eq("offset",page.getOffset() - MODBUS_REGISTER_DEFAULT_ADDRESS);
        }

        ModbusNodeInfoPage nodeInfoPage = this.page(page, queryWrapper);
        List<ModbusNodeInfo> records = nodeInfoPage.getRecords();
        List<ModbusNodeInfo> nodeInfoList = records.stream().map(modbusNodeInfo -> {
            modbusNodeInfo.setOffset(modbusNodeInfo.getOffset() + MODBUS_REGISTER_DEFAULT_ADDRESS);
            return modbusNodeInfo;
        }).collect(Collectors.toList());

        nodeInfoPage.setRecords(nodeInfoList);

        return nodeInfoPage;
    }


}
